【AWS】Route53でPublic/Private 同じドメイン名のゾーンを管理する
はじめに
こんにちは植木和樹@上越妙高オフィスです。Route53で待望の新機能Private DNSがリリースされました。
アプリケーションエンジニア視点から、PrivateなDNSをRoute53で管理できるようになると、なにがうれしいのか。そんなことを考えながら新機能を試してみました。
ユースケース
例えば下記図のようにWebとAPIという2台構成のシステムがあったとします。Webサーバーで動くアプリケーションは、情報の問い合わせをAPIサーバーに対して行うとします。社内ローカルでアプリケーションを開発しているとき、APIサーバーの名前解決は「グローバルIPアドレス」が返り、インターネット越しに通信を行います。
しかしこのアプリケーションをVPC上のEC2サーバーにデプロイした際に、VPC外と同様グローバルIPアドレスで名前解決されてしまうと、WebサーバーからいったんVPC外にでて再度VPC内に入り直すという無駄な通信が発生してしまいます。
ここは「プライベートIPアドレス」で名前解決しVPC内に閉じた通信を行いたいところです。
解決策
上記の課題を解決するためにはRoute53に2つの機能が必要になります。
- 2つのDNSゾーンを同じ名前で作成できる
- 同一のレコードに対してVPC内/外どちらから名前解決されたかに応じてプライベート/グローバル異なるIPアドレスを返す
2つのDNSゾーンを同じ名前で作成できる
結論からいうと、問題なくできます。Route53では"Domain Name"だけでなく"Type"(Public or Private)でユニークになっており、同じドメイン名のゾーンが作成できます。(Private DNSの場合は同じ"Domain Name"に対して、同一の"VPC Id"はAssociateできないようです)
同一のレコードに対してVPC内/外どちらから名前解決されたかに応じてプライベート/グローバル異なるIPアドレスを返す
こちらも問題ありません。VPC内から引いたゾーンのネームサーバと、VPC外から引いたゾーンのネームサーバーが異なるためです。そのため同一のホスト名に対してVPC内外どちらから名前解決するかに応じてプライベート/グローバルどちらのIPアドレスを返すかを変更できます。
VPC内で名前解決した場合
[ec2-user@ip-172-31-27-178 ~]$ dig api.example.com. +short 172.31.10.203
VPC外で名前解決した場合
$ dig api.example.com. +short 54.xxx.yyy.111
ELBを利用する際の注意点
上記の構成だとAPIサーバーが冗長化されていません。ここはELBを用いてEC2をMulti-AZにしておきたいところです。
ではPrivate DNSにELBのAliasを作成するのはどうでしょうか?VPC内から名前解決した時にはプライベートIPアドレスを返してくれると嬉しいのですが・・・結論からいうとNGでした。
VPC内からPublicなELBを名前解決した場合
[ec2-user@ip-172-31-27-178 ~]$ dig api.example +short 54.xxx.yyy.101 54.xxx.yyy.201
PublicなELBに対するアドレス解決はあくまでもグローバルIPになるようですね。APIサーバーを冗長構成にしたい場合には、別途Internal ELBを用意し、PrivateなゾーンについてはそちらのAliasを指定することで解決可能です。
まとめ
PrivateなDNSを外部にさらすことなくRoute53で管理できるようになったことで、アプリケーションからみて透過的にVPC内外の環境に応じた名前解決ができるようになり、デプロイ時の設定変更が不要になることもあるのではないでしょうか。
また同一のゾーンでPublic/Privateを管理していた場合にはゾーンを区別することで、管理もスッキリするのではないでしょうか。VPNやDirect Connect経由でVPCに接続する環境であれば、社内DNSサーバーをRoute53に任せてしまうという使い方もあるかもしれませんね。
VPN/DX経由のDNS問い合わせは、VPCのDNSサーバーは答えてくれませんよ。なので、オンプレからの名前解決をPrivate Zoneで対応することは難しいとおもいます。
Private hosted zones do not support transitive relationships outside of the VPC; for example, you cannot access your resources using their custom private DNS names from the other side of a VPN connection.
Using DNS with Your VPC - Amazon Virtual Private Cloud http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-dns.html#vpc-private-hosted-zones
みなさんもどんどんRoute53を使ってみてください!